package test.socket;

import java.io.File;
import java.io.IOException;
import hyl.core.MyDate;
import hyl.core.MyFun;
import hyl.core.fun.MyByte;
import hyl.core.io.MyFile;
import hyl.core.net.MySocket;
import hyl.core.net.MyUdp;
import hyl.core.net.pg.Netpg2Msgs;
import hyl.core.net.pg.Netpg2Req1;
import hyl.core.run.MyRun;
import hyl.ext.web.ms.BInfo;

/**
 * microserver manager 微服务管理 组件 msm 微服务注册,微服务删除,服务重启,服务停止,服务启动,服务升级,服务查看
 * 
 * MsB 会伴随 应用系统启动 注意: 发送的字节必须小于1400
 * 
 * @author 37798955@qq.com
 *
 */
public class UMsB {
	/**
	 * 初始化加载配置
	 */
	BInfo im;
	MyUdp _cli;
	Netpg2Req1 netpg = new Netpg2Req1();
	transient File msm = MyFile.find("msb.ini");
	public void init() {
		im = new BInfo();
		im.init(msm);
		if (im.getAPort() == 0)
			_cli = new MyUdp();
		else
			_cli = new MyUdp(im.getAPort());
		conn();
	}

//	public static void test() {
//		InfoMsm im = new InfoMsm();
//		im.init();
//		System.out.println(JSON.toJSONString(im));
//		im.save();
//		Netpg2Req1 netpg = new Netpg2Req1();
//		// byte[] eb=im.encode();
//		// MyFun.print(eb.length,MyByte.bytesToHex(eb));
//		netpg.set(0, null, im.encode());
//		byte[] bb = netpg.getSendBytes();
//		// MyFun.print(bb.length,MyByte.bytesToHex(bb));
//		Netpg2Req1 netpg2 = new Netpg2Req1();
//		netpg2.ini(bb);
//		byte[] bb2 = netpg2.getBb携参();
//		InfoMsm im2 = new InfoMsm();
//		im2._信息 = InfoMsm.decode(bb2);
//		System.out.println(JSON.toJSONString(im2));
//	}

	/**
	 * 接入服务中心
	 */
	public void conn() {

		// MyFun.print("MsmClient conn():",中心);
		_cli.set远程地址(MySocket.getIPAddress(im.getA_ip()));
		_cli.receive((rp) -> {
			byte[] bb = rp.getData();
			int len = rp.getLength();
			Netpg2Msgs np = new Netpg2Msgs(MyByte.subBytes(bb, 0, len));
			im.connected(np.msgs);
			// MyFun.print("MsmClient conn() receive im:", np.cmd, np.msgs[0], np.msgs[1]);
			ping();
			return true;
		});

		// 连接指令包 0 开头
		netpg.set(0, null, im.encode());
		try {
			// MyFun.print("MsmClient conn() send im:", netpg.getBb携参().length);
			// MyFun.print("MsmClient conn() send im:", JSON.toJSONString(im));
			_cli.send(netpg.toSendBytes());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 维持心跳
	 */
	protected void ping() {
		MyRun.getInstance(this.getClass().getName()).execute(() -> {
			boolean flag = true;
			while (flag) {
				im.ping();
				netpg.set(1, im.get("ID"), null);
				try {
					_cli.send(netpg.toSendBytes());
					MyDate.sleeps(5);
				} catch (IOException e) {
					e.printStackTrace();// 如果异常是否还要维持? 不维持
					flag = false;
				}
			}
		});
	}

	/**
	 * 服务异常
	 */
	public void errOrExit(String err) {
		try {
			if (err == null)
				err = "未知错误";
			im.err(err);
			im.save();
			netpg.set(2, im.get("ID"), err.getBytes());
			_cli.send(netpg.toSendBytes());
			_cli.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
